package label_center

import (
	"database/sql/driver"
	"encoding/json"
	"errors"
)

func (o Tag) Value() (driver.Value, error) {
	return json.Marshal(o)
}

func (o *Tag) Scan(value interface{}) error {
	b, ok := value.([]byte)
	if !ok {
		return errors.New("failed to unmarshal Tag value")
	}
	var fame Tag
	err := json.Unmarshal(b, &fame)
	if err != nil {
		return err
	}
	*o = fame
	return nil
}

// Draw 绘制源数据结构
type Draw struct {
	DeviceId string `json:"device_id"` //设备Id
	Tags     []Tag  `json:"frames"`    //帧集合
}

// Tag 帧
type Tag struct {
	//时间段可以有三种表示方式，1、开始start-结束end，2、开始start+持续长度duration，3、中间点center+持续长度duration，这三种传值都支持，但程序内部最终都会转为1
	AbsoluteTime *AbsoluteTime `json:"absolute_time,omitempty"` //绝对
	RelativeTime *RelativeTime `json:"relative_time,omitempty"` //相对
	Metas        []Meta        `json:"metas"`                   //绘制元素集合
}

// Meta 元数据，一个绘制元素
type Meta struct {
	X           int64   `json:"x"`                      //横向坐标，像素
	Y           int64   `json:"y"`                      //纵向坐标，像素
	StrokeStyle string  `json:"strokeStyle,omitempty"`  //边框色，默认绿色，格式例如:rgb(255,0,0)
	LineWidth   int64   `json:"lineWidth,omitempty"`    //边框线粗，像素，默认3px
	Fill        bool    `json:"fill,omitempty"`         //是否填充，默认否
	FillStyle   string  `json:"fillStyle,omitempty"`    //填充颜色，默认绿色，格式例如:rgb(255,0,0)
	GlobalAlpha float64 `json:"globalAlpha,omitempty"`  //填充透明度0.1-1，默认1不透明
	Remark      string  `json:"remark,omitempty"`       //备注
	Uuid        string  `json:"uuid,omitempty"`         //唯一ID
	TypeId      int     `json:"type_id,omitempty"`      //类型/方案ID
	ProtoWidth  int64   `json:"proto_width,omitempty"`  //像素相对值的原始宽
	ProtoHeight int64   `json:"proto_height,omitempty"` //像素相对值的原始高
	//以下形状一个meta只有一个
	Rect     *Rect     `json:"rect,omitempty"`     //矩形
	ArcRect  *ArcRect  `json:"arcRect,omitempty"`  //圆角矩形
	Arc      *Arc      `json:"arc,omitempty"`      //正圆
	Ellipse  *Ellipse  `json:"ellipse,omitempty"`  //椭圆
	Triangle *Triangle `json:"triangle,omitempty"` //等边三角
	Rhombus  *Rhombus  `json:"rhombus,omitempty"`  //菱形
	Text     *Text     `json:"text,omitempty"`     //文字
	Image    *Image    `json:"image,omitempty"`    //图片
	Arrow    *Arrow    `json:"arrow,omitempty"`    //箭头
	Mosaic   *Mosaic   `json:"mosaic,omitempty"`   //马赛克
	Grid     *Grid     `json:"grid,omitempty"`     //网格，用于移动侦测（不需要坐标，xy传0）
	Pen      *[]Pen    `json:"pen,omitempty"`      //画笔（路径点/不规则形状）

}

// AbsoluteTime 绝对时间毫秒，Unix时间戳
type AbsoluteTime struct {
	StartUnixMs  int64 `json:"start_unix_ms,omitempty"`
	EndUnixMs    int64 `json:"end_unix_ms,omitempty"`
	CenterUnixMs int64 `json:"center_unix_ms,omitempty"`
	DurationMs   int64 `json:"duration_ms,omitempty"`
}

// RelativeTime 相对时间毫秒，从0开始
type RelativeTime struct {
	StartMs    int64 `json:"start_ms,omitempty"`
	EndMs      int64 `json:"end_ms,omitempty"`
	CenterMs   int64 `json:"center_ms,omitempty"`
	DurationMs int64 `json:"duration_ms,omitempty"`
}

// Rect 矩形
type Rect struct {
	Width  int64  `json:"width,omitempty"`
	Height int64  `json:"height,omitempty"`
	Text   string `json:"text,omitempty"`
	Center bool   `json:"center,omitempty"` //是否以中心为坐标点，默认true，false以左上角为坐标点
}

// ArcRect 圆角矩形
type ArcRect struct {
	Width  int64 `json:"width,omitempty"`
	Height int64 `json:"height,omitempty"`
	R      int64 `json:"r,omitempty"`      //圆角半径，像素
	Center bool  `json:"center,omitempty"` //是否以中心为坐标点，默认true，false以左上角为坐标点
}

// Arc 正圆
type Arc struct {
	R int64 `json:"r,omitempty"` //半径
}

// Ellipse 椭圆
type Ellipse struct {
	Rx int64 `json:"rx,omitempty"` //椭圆长轴的半径，像素
	Ry int64 `json:"ry,omitempty"` //椭圆短轴的半径，像素
}

// Triangle 等边三角
type Triangle struct {
	L      int64 `json:"l,omitempty"`      //边长或中心圆的半径，像素
	Invert bool  `json:"invert,omitempty"` //是否倒三角，默认false
	Field  bool  `json:"field,omitempty"`  //是否以中心领域（中心圆）为起点，如果是则L为中心圆半径，如果否则L为边长，默认false
	Center bool  `json:"center,omitempty"` //是否以中心为坐标点，默认true，false以左上角为坐标点
}

// Rhombus 菱形
type Rhombus struct {
	Width  int64 `json:"width,omitempty"`
	Height int64 `json:"height,omitempty"`
	Center bool  `json:"center,omitempty"` //是否以中心为坐标点，默认true，false以左上角为坐标点
}

// Text 文字
type Text struct {
	Text         string `json:"text,omitempty"`         //文本内容
	MaxWidth     int64  `json:"maxWidth,omitempty"`     //最大宽度，超过自动换行
	Font         string `json:"font,omitempty"`         //当前我们用来绘制文本的样式。这个字符串使用和 CSS font 属性相同的语法。 默认的字体是 10px sans-serif。
	TextAlign    string `json:"textAlign,omitempty"`    //文本对齐选项。 可选的值包括:start, end, left, right or center。 默认值是 start。
	TextBaseline string `json:"textBaseline,omitempty"` //基线对齐选项，可选的值包括:top, hanging, middle, alphabetic, ideographic, bottom。默认值是 alphabetic。。
	Direction    string `json:"direction,omitempty"`    //文本方向。可能的值包括:ltr, rtl, inherit。默认值是 inherit。
}

// Image 图片
type Image struct {
	Src string `json:"src,omitempty"` //图片路径
}

// Arrow 箭头
type Arrow struct {
	L        int64 `json:"l,omitempty"`        //箭头整体长度，像素
	Degree   int64 `json:"degree,omitempty"`   //箭头尖锐度 0-180度，默认30度
	Distance int64 `json:"distance,omitempty"` //箭头和指向点的距离，像素，默认10px
	Direct   int64 `json:"direct,omitempty"`   //箭头指向的度数，0-360度，默认0度，向上
}

// Mosaic 马赛克
type Mosaic struct {
	Width  int64 `json:"width,omitempty"`
	Height int64 `json:"height,omitempty"`
	Size   int64 `json:"size,omitempty"` //一个像素块大小，颗粒度
}

// Pen 画笔（路径点/不规则形状）
type Pen struct {
	X int64 `json:"x,omitempty"`
	Y int64 `json:"y,omitempty"`
}

// 网格（移动侦测）
type Grid struct {
	Map    string `json:"map,omitempty"`
	Column int64  `json:"column,omitempty"`
	Row    int64  `json:"row,omitempty"`
}
